package com.ys.day29.Reflect.p9暴力破解;

import com.ys.day29.Reflect.p6Reflect与Constructor对象.Student;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

/**
 * 描述:
 * 通过某种方式调用私有的属性，设置私有属性的值，这个过程叫做暴力破解
 * * 场景：使用暴力破解完成对私有属性stuName的调用
 * * 步骤：
 * * 1 反射入口
 * * 2 使用反射创建对象
 * * 3 根据属性名称获取属性签名，得到Field对象
 * * 4 设置Field对象的可访问性为true
 * * 5 调用Field对象的set(obj,value)方法完成暴力破解
 *
 * @author CodeYang
 * @version 2021/1/11 23:33
 */
public class P1暴力破解 {


    public static void main(String[] args) {
        Class<Student> aClass = Student.class;
        try {
            // 获取无参构造方法签名
            Constructor<Student> constructor = aClass.getDeclaredConstructor();
            // 创建对象
            Student student = constructor.newInstance();
            // 获得Filed 属性签名对象
            Field name = aClass.getDeclaredField("name");
            //暴力破解核心: 设置属性的可访问性为true  私有属性默认为 false, 所以设置为true 这样就可以访问私有属性了
            name.setAccessible(true);
            // set(Object obj, Object value) 参数1: 要修改的对象 参数2 修改的值
            name.set(student,"Json");
            System.out.println(student);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
